<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/10/20
 * Time: 13:54
 */
?>

<link rel="stylesheet" href="/css/autonavi.css">
<script src="/js/autonavi.js" type="text/javascript">
</script>
<script type="text/javascript">
    $(document).ready(function(){
        an.init();
    });
</script>
<div class="page-center">
    <div class="container">
        <div class="row">
            <div>
                <h1>
                    文档
                    <br>
                    <small>
                        通过“文档”详细了解iphp开发
                    </small>
                </h1>
                <div class=" _autonavi main-cont">
                    <h2 class="_an" data-navname="2">欢迎使用iphp</h2>
                    <div>
                        <p>欢迎使用iphp，iphp是一套给php网站开发者使用的应用程序开发框架，它的目标是让你能够更自由更快速的开发，它提供了一个简单的接口和
                        逻辑结构。通过完整且简单的结构，iphp让你更加专注于你的创造性工作。</p>
                    </div>
                    <hr/>
                    <h2 class="_an" data-navname="3">基础</h2>
                    <div>
                        <p>通过快速开始，我们已经大概了解iphp是如何驱动整个web程序运行的了。但如果要更深入的使用和扩展iphp框架，
                        就需要了解更多的iphp的结构和运行环境。iphp非常的简单，只有一个核心的类库文件，掌握起来非常简单。
                        </p>
                    </div>
                    <hr/>
                    <h3 class="_an" data-navname="4">获取iphp</h3>
                    <div>
                        <p>
                            通过 <a href="http://git.oschina.net/lec/iphp">http://git.oschina.net/lec/iphp</a> 获取iphp的最新内容。
                        </p>
                    </div>
                    <h3 class="_an" data-navname="5">环境要求</h3>
                    <div>
                        <p>iphp的最低php要求是5.3版本，不过建议使用5.6版本的php。因为很多的特性都是基于php5.6+的，如果本文档未及时更新，请使用php5.6版本。
                        目前最新的php版本是7。iphp并没有在php7的环境中测试运行过。
                        </p>
                    </div>
                    <hr/>
                    <h2 class="_an" data-navname="6">iphp的文件结构</h2>
                    <div>
                        <pre>
├─iphp 框架主目录（包含iphp运行所需的所有文件）
│  ├─app                  程序主要文件夹
│  │  ├─c                 逻辑控制文件夹
│  │  ├─conf              程序配置文件夹
│  │  ├─lib               程序运行核心库文件夹
│  │  ├─m                 数据处理文件夹
│  │  ├─v                 模板文件夹
│  │  |  ├─test1          模板test1分组
│  │  |  ├─test2          模板test2分组
│  │  |  ├─....           更多模板分组
│  ├─core                 iphp核心文件夹
│  │  ├─conf.php          核心配置文件
│  │  ├─i.php             iphp启动文件
│  │  ├─iclass.php        iphp核心类文件
│  │  ├─iinit.php         iphp数据初始化
│  │  ├─testconf.php      测试环境核心配置文件
│  ├─plus                 第三方类库文件夹
│  ├─public               web程序运行目录（服务器的根目录设置为此文件夹）
│  │  ├─css               css文件夹
│  │  ├─img               img文件夹
│  │  ├─js                js文件夹
│  │  ├─cmd.php           命令行模式运行iphp的入口文件
│  │  ├─index.php         web模式运行iphp的入口文件
                        </pre>
                    </div>
                    <hr/>

                    <h3 class="_an" data-navname="7">入口文件</h3>
                    <div>
                        <h4>web模式入口文件</h4>
                        <p>
                            web模式入口文件是通过浏览器运行程序的入口文件:<code>index.php</code>。在配置web服务器时，
                            需要将网站的根目录解析到<code>public</code>，并且将默认首页设置为<code>index.php</code>。
                        </p>
                        <h4>命令行模式入口文件</h4>
                        <p>
                            命令行模式入口文件是通过命令行来启动整个程序的运行文件:<code>cmd.php</code>。
                            <pre>
命令行模式运行iphp框架，如 php cmd.php control_name method_name
第一个参数为_c 第二个参数为_m 剩余的参数传入function中 PScmd运行的函数最好接受一个参数
                            </pre>
                        </p>
                    </div>
                    <hr/>

                    <h3 class="_an" data-navname="8">规范与建议</h3>
                    <div>
                        iphp有一个简单且非常自由的结构，开发者可以使用各种格式来开发，不过我们还是要遵循一定的开发规范来确保程序的通用可读和安全。
                        <br>
                        <ul>
                            <li><code>app/c</code>目录存放逻辑控制的文件(就称之为控制器吧)，这里的文件控制整个网站程序的运行和业务流程；
                                <br>
                                <code>app/m</code>目录存放数据处理的文件，各种数据的处理和包括数据库的访问都在这里完成，这个目录里的类不能直接被运行，只有通过“逻辑控制文件”调用。因此，尽管可以在任何位置访问数据库，但最好遵循只在<code>app/m</code>这里访问数据库的原则。</li>
                            <li>
                                为了保证程序在任何的操作系统中都可以正常运行（windows不区分文件名的大小写，好吧），所以文件夹和文件名都用小写字母，单词之间可以用下划线"_"间隔。如，<code>comm.php,index.php,user_manage.php</code>。
                            </li>
                            <li>
                                <code>app/c</code>和<code>app/m</code>中的文件有基本同意的格式：如<code>test_class.php</code>
                                <pre>
namespace c;
class test_class extends \i{
    private static $_i;
    public $db;
    public static function i($pars=[]){
        self::$_i or self::$_i=new \c\test_class($pars);
        return self::$_i;
    }
    public function __construct($pars=[]){
        parent::__construct($pars);
    }
}
                                </pre>
                                文件名必须和类名相同，才能够通过核心类的自动调用机制加载相应的类中的方法。
                            </li>
                            <li>
                                <code>app/v</code>存放的是模板文件，网站中模板文件使用比较多，最好可以通过文件夹对模板进行分组。
                            </li>
                        </ul>
                    </div>
                    <hr>
                    <h2 class="_an">初始化</h2>
                    <div>
                        iphp不用任何初始化的配置就可以运行。当然，在有些需要连接数据库或者其他的需要特殊的配置的时候需要事先配置。
                        <br>
                        例如：<code>conf.php</code>中默认包含了数据库配置。
                    </div>
                    <hr>
                    <h2 class="_an">配置</h2>
                    <div>
                        iphp包含了两类配置：
                        <br>
                        一类是核心配置，存放在<code>core/conf.php</code>文件中，通过<code>\i::commconf()</code>方法获取配置的值；(当我们通过<code>localhost</code>访问的时候，默认加载<code>/core/testconf.php</code>配置文件。)
                        <br>
                        另一类是程序配置，存放在<code>app/conf</code>文件夹中，通过<code>\i::appconf()</code>方法获取配置内容；
                        <br>
                        <pre>
core/conf.php配置示例：
return [
    "_sys"=>[
        'xsrf'=>true,
    ],
    "db"=>[
        "dbname" => '数据库名字',
        'dbhost' => '数据库地址',
        'dbport' => '数据库端口',
        'dbuser' => '用户名',
        'dbpwd'  => '用户密码',
    ],
];
                        </pre>
                        通过<code>\i::commconf('db')</code>获取db的所有配置。通过<code>\i::commconf('db','dbhost')</code>可以单独获取数据库地址这一项配置的值；
                        <br>
                        <pre>
<code>app/conf</code>文件夹中的配置文件示例：(以<code>app/conf/test.php</code>为例)
return [
    'key1'=>['array1'],
    'key2'=>val2,
];
                        </pre>
                        通过<code>\i::appconf('test')</code>来获取整个配置文件的内容；
                    </div>
                    <hr>
                    <h2 class="_an">核心类</h2>
                    <div>
                        iphp只有一个核心的类库：<code>core/iclass.php</code>，类名是：<code>i</code>；
                        <br>核心类包含了所有的需要使用的方法。
                    </div>
                    <hr>
                    <h2 class="_an">核心方法</h2>
                    <div>
                        几个常用的核心方法：
                        <br>
                        <br>
                        <h4>模板渲染<code>public static function v($_vn=[],$_vd=[],$r=false)</code></h4>
                        <div>
                             参数：
                            <br>
                            <code>array $_vn</code>：传入模板数组。<br>
                             <code>array $_vd</code>：传入模板的参数。<br>
                             <code>bool $r</code>：是否返回渲染好的模板，默认直接输出，传入参数true则返回模板。<br>
                            返回值：
                            <br>
                            如果设置第三个参数为true，则返回渲染好的模板。
                            <br>
                            示例：
                            <pre>
\i::v(['viewtest1/vt11','viewtest1/vt12','viewtest2/vt21'],['word'=>'hello world','ary'=>['hello','world']]);
                            </pre>
                            依次加载 <code>v/viewtest1/vt11</code>， <code>v/viewtest1/vt12</code>， <code>v/viewtest2/vt21</code>三个模板文件，并传入参数 <code>['word'=>'hello world','ary'=>['hello','world']]</code>，在模板文件中可以使用 <code>$word</code>，<code>$ary</code> 这两个参数。
                        </div>
                        <br>
                        <h4>构造链接<code>public static function a($_c,$_m,$pars=[],$r=true)</code></h4>
                        <div>
                            参数：<br>
                            <code>string $_c</code>：传入要加载的逻辑控制类。<br>
                            <code>string $_m</code>：传入要加载的方法br。<br>
                            <code>array $pars</code>：url中其他的参数。<br>
                            <code>bool $r</code>：是否返回构造好的类br。<br>
                            返回值：<br>
                            如果设置参数为返回结果，那么就返回构造好的链接地址。
                            <br>
                            示例：
                            <pre>
$link=\i::a('comm','test',['h'=>'hello','w'=>'world'],true);
                            </pre>
                            返回<code>http://[地址]/?_c=comm&_m=test&h=hello&w=world</code>并赋值给<code>$link</code>;<code>[地址]</code>如果是本地默认是 <code>localhost</code>。
                        </div>
                    </div>
                    <hr>
                    <h2 class="_an">控制器与模型？</h2>
                    <div>
                        iphp并没有严格意义上的控制器或者模型，对于逻辑控制层和数据层的区分就是一个是在<code>app/c</code>文件夹中，一个在<code>app/m</code>。逻辑控制部分（<code>app/c</code>中的文件和类）与数据处理部分（<code>app/m</code>中的文件和类）通过文件夹不同来区分。
                        <br>
                        当然，可以自定义一个 <code>app/x</code>文件夹，并且将命名空间设置为 <code>x</code>，那么就可以通过 <code>\x\class_name::i()->method_name()</code>调用相应类中的方法。不过，iphp默认的通过url或者命令行，只能访问 <code>app/c</code>中的文件和类。
                    </div>
                    <hr>
                    <h2>模板</h2>
                    <div>
                        iphp的模板也是最简单的，通过 <code>iclass</code>中的 <code>v</code>方法来渲染模板。
                        <br>
                        当然，也可以将其他的模板引擎作为第三方类加载。
                    </div>
                    <hr>
                    <h2 class="_an">常用核心库</h2>
                    <div>
                        lib文件夹存放的是核心的常用第三方类库，目前有 <code>db.php</code>， <code>verify.php</code>。
                        <br>
                        <code>db.php</code>是数据库连接类，配合 <code>app/m/dbo.php</code>使用，很方便的通过“链式操作”进行数据操作。【PS：详见dbo类使用教程】
                        <br>
                        <code>verify.php</code>是数据验证类，可以直接用来做用户输入数据验证的。
                        <br>
                        lib文件夹中的第三方类库通过 <code>\lib\class_name</code>就可以调用。
                        <br>
                        示例：调用数据库连接类：
                        <pre>
$db=\lib\db::i(\i::commconf('db'));
                        </pre>
                    </div>
                    <hr>
                    <h2 class="_an">第三方类库</h2>
                    <div>
                        plus文件夹中存放的是第三方的类库，通过 <code>\i::pluslib('文件位置')</code>调用。
                        <br>
                        示例：调用 <code>plus/phpQuery/phpQuery.php</code>
                        <pre>
\i::pluslib("phpQuery/phpQuery");
                        </pre>
                        示例：调用 <code>plus/test.php</code>
                        <pre>
\i::pluslib("test");
                        </pre>
                    </div>
                    <hr>
                    <h2 class="_an">其他问题</h2>
                    <div>
                        这只是一个简单的文档，iphp的结构并不复杂，因此只需要读一读入口文件与核心的代码，基本上就可以了解iphp的运作原理。
                        <br>
                        <code>app/m/dbo.php</code>文件是依赖dbo链接的一个数据库访问层，将会单独做详细的说明。
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div style="position: fixed;bottom: 0px;right: 0px;border: 1px solid red" id="_msg">
    123
</div>

